package com.augurit.common.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.augurit.common.base.dao.BaseDao;
import com.augurit.common.entity.AcUserShortcut;
import com.augurit.common.system.convert.AcMenuConverter;
import com.augurit.common.system.web.org.form.AcUserShortcutForm;
import com.augurit.common.util.HqlUtils;
import com.augurit.common.util.lang.CollectionUtils;

/**
 * 用户自定义的快捷菜单DAO类
 */
@Repository
public class AcUserShortcutDao extends BaseDao<AcUserShortcut, Long> {

	public AcUserShortcutForm getForm(Long id){
		AcUserShortcutForm form = null;
		
		if(id != null){
			AcUserShortcut entity = this.get(id);
			if(entity != null)
				form = AcMenuConverter.convertToForm(entity);
		}

		return form;
	}
	
	/**
	 * 保存用户自定义的快捷菜单Form对象
	 * @param form 用户自定义的快捷菜单Form对象
	 */
	public void save(AcUserShortcutForm form){
		
		if(form != null){
			AcUserShortcut entity = null;
			
			//准备VO对象
			if(form != null && form.getUsId() != null){
				entity = this.get(form.getUsId());
			}else{
				entity = new AcUserShortcut();
			}
			
			//属性值转换
			AcMenuConverter.convertToEntity(form, entity);
			
			//保存
			super.save(entity);
			
			//回填ID属性值
			form.setUsId(entity.getUsId());
		}
	}
	
	/**
	 * 获取拥有某个快捷菜单的用户
	 * @param menuId 菜单id
	 * @return
	 */
	public Long[] getUserIdsOwnedShortcut(Long menuId){
		if( menuId != null){
			String hql = "select ps.userId from AcUserShortcut ps where ps.menuId = ?";
			List values = new ArrayList();
			values.add(menuId);
			
			List<Long> list = this.find(hql, values);
			return CollectionUtils.toLongArray(list);
		}
		return null;
	}
	
	/**
	 * 根据用户id和菜单id数组获取实体对象
	 * @param userId 用户id
	 * @param menuIds 菜单id数组
	 * @return AcUserShortcut对象列表
	 */
	public List<AcUserShortcut> getByUserIdAndMenuIds(Long userId, Long...menuIds){
		if(userId != null && menuIds != null && menuIds.length > 0){
			String hql = "from AcUserShortcut ps where ps.userId = ? and " + HqlUtils.buildOrCondition("ps", "menuId", menuIds);
			List values = new ArrayList();
			values.add(userId);
			
			return this.find(hql, values);
		}
		return null;
	}
	
	/**
	 * 根据菜单id和用户id数组获取实体对象
	 * @param menuId 菜单id
	 * @param userIds 用户id数组
	 * @return AcUserShortcut对象列表
	 */
	public List<AcUserShortcut> getByMenuIdAndUserIds(Long menuId, Long...userIds){
		if(menuId != null && userIds != null && userIds.length > 0){
			String hql = "from AcUserShortcut ps where ps.menuId = ? and " + HqlUtils.buildOrCondition("ps", "userId", userIds);
			List values = new ArrayList();
			values.add(menuId);
			
			return this.find(hql, values);
		}
		return null;
	}
	
	/**
	 * 获取指定用户拥有的快捷菜单id数组
	 * @param userId 用户id
	 * @return 菜单id数组
	 */
	public Long[] getShortcutIdsByUserId(Long userId){
		if( userId != null ){
			String hql = "select ps.menuId from AcUserShortcut ps where userId = ? order by ps.sortNo";
			List values = new ArrayList();
			values.add(userId);
			
			List<Long> menuIdList = this.find(hql,values);
			if(menuIdList !=null && menuIdList.size() > 0)
			 return CollectionUtils.toLongArray(menuIdList);
		}
		return null;
	}
	
	/**
	 * 给用户添加快捷菜单
	 * @param userId 用户id 
	 * @param startNo 插入时的初始序号，从1开始编号 
	 * @param menuIds 菜单id数组
	 */
	private void insertShortcutToUser(Long userId, int startNo, Long...menuIds){
		if(userId != null && menuIds != null && menuIds.length > 0){
			for(Long menuId:menuIds){
				AcUserShortcutForm form = new AcUserShortcutForm();
				form.setUserId(userId);
				form.setMenuId(menuId);
				form.setSortNo(startNo++);
				this.save(form);
			}
		}
	}
	
	/**
	 * 获取用户拥有的快捷菜单数
	 * @param userId
	 * @return
	 */
	public Long getNumOfShortcut(Long userId){
		if( userId != null){
			String hql = "select count(ps.menuId) from AcUserShortcut ps where ps.userId = ?";
			List values = new ArrayList();
			values.add(userId);
			
			List list = this.find(hql, values);
			return (Long)list.get(0);
		}
		return -1L;
	}
	
	/**
	 * 把用户已有的快捷菜单从指定位置向前挪动num个位置
	 * @param userId 用户id
	 * @param startPos 开始位置，0表示第一个位置
	 * @param num 向后移动的位置数
	 */
	public void upward(Long userId, int startPos, int num){
		if(userId != null && num > 0){
			//找出用户的快捷菜单列表
			List<AcUserShortcut> entities = this.findBy("userId", userId);
			if(entities != null && entities.size() > startPos){
				//从startPos开始往前挪num个位置
				for(int i = startPos; i < entities.size(); i++){
					AcUserShortcut entity = entities.get(i);
					Integer sortNo = entity.getSortNo() - num;
					entity.setSortNo(sortNo);
					this.save(entity);
				}
			}
		}
	}
	/**
	 * 把用户已有的快捷菜单从指定位置向后挪动num个位置
	 * @param userId 用户id
	 * @param startPos 开始位置 0表示第一个位置
	 * @param num 向后移动的位置数
	 */
	public void backward(Long userId, int startPos, int num){
		if(userId != null && num > 0){
			//找出用户的快捷菜单列表
			List<AcUserShortcut> entities = this.findBy("userId", userId);
			if(entities != null && entities.size() > startPos){
				//从startPos开始往后挪num个位置
				for(int i = startPos; i < entities.size(); i++){
					AcUserShortcut entity = entities.get(i);
					Integer sortNo = entity.getSortNo() + num;
					entity.setSortNo(sortNo);
					this.save(entity);
				}
			}
		}
	}
	
	/**
	 * 插入快捷菜单到某个用户所有快捷菜单最前面
	 * @param userId
	 * @param menuIds
	 */
	public void insertAtFirst(Long userId, Long...menuIds){
		if(userId != null && menuIds != null && menuIds.length > 0){
			//用户原来的快捷菜单向后移动
			backward(userId, 0, menuIds.length);
			//从第一个位置插入
			insertShortcutToUser(userId, 1, menuIds);
		}
	}
	
	/**
	 * 插入快捷菜单到某个用户所有快捷菜单最后面
	 * @param userId
	 * @param menuIds
	 */
	public void insertAtLast(Long userId, Long...menuIds){
		if(userId != null && menuIds != null && menuIds.length > 0){
			//获取用户的原来已有的快捷菜单数目
			int numOfMenu = this.getNumOfShortcut(userId).intValue();
			//从最后一个位置插入
			insertShortcutToUser(userId, numOfMenu+1, menuIds);
		}
	}
	
	/**
	 * 从中间插入快捷菜单
	 * @param userId 用户id
	 * @param pos 插入的位置
	 * @param menuIds 快捷菜单列表
	 */
	public void insertAtMiddle(Long userId, int pos, Long...menuIds){
		if(userId != null && pos > 0 && menuIds != null && menuIds.length > 0){
			//用户的第pos个快捷菜单往后移
			backward(userId, pos-1, menuIds.length);
			//从中间第pos个位置插入
			insertShortcutToUser(userId, pos, menuIds);
		}
	}
	
}
